package gold.utils;

public class BitUtil {

    //求解正数的二进制表示法中的 1 的位数
    public static int countBit(int num) {
        int count = 0;
        for (; num > 0; count++) {
            num &= (num - 1);
        }
        return count;
    }

    //获取 整数 num 的第 i 位的值
    //思路：如果第 i 位 与 1 相与 结果为1 表明第 i 位为1；如果为0 表明第 i 位为0
    public static boolean getBit(int num, int i) {
        return ((num & (1 << i)) != 0);//true 表示第i位为1,否则为0
    }

    //将 整数 num 的第 i 位的值 置为 1
    // 思路：第 i 位与0 或，值不变。第 i 位与1 或，变成1。因此，我们的目标是 num 与 一个第 i 位值为1，其它位的值都为0的数相等
    public static int setOneBit(int num, int i) {
        return (num | (1 << i));
    }

    //将第 i 位设置为0（清0）
    //思路：第 i 位和0与，第 i 位就变成了0。其它位 都与 1 与，其它位保持不变。这样，就只把第 i 位清0了
    public static int getZeroBit(int num, int i) {
        int mask = ~(1 << i);//000100
        return (num & (mask));//111011
    }

    public static void main(String[] args) {
        System.out.println(Integer.toBinaryString(4194311));
    }


}
